#include <type_traits>

#include <logger.h>

int main()
{
    VALUE_LOGGER((std::is_same<bool, int>())); // false
    VALUE_LOGGER((std::is_same<bool, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<const bool, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_const_t<const bool>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<bool &, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_reference_t<bool &>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<bool &&, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_reference_t<bool &&>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<const bool &, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_const_t<std::remove_reference_t<bool &>>, bool>())); // true
    VALUE_LOGGER((std::is_same<std::remove_reference_t<std::remove_const_t<bool &>>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<const bool &&, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_const_t<std::remove_reference_t<bool &&>>, bool>())); // true
    VALUE_LOGGER((std::is_same<std::remove_reference_t<std::remove_const_t<bool &&>>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<volatile bool, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_volatile_t<volatile bool>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<volatile bool &, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_reference_t<std::remove_volatile_t<volatile bool&>>, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_volatile_t<std::remove_reference_t<volatile bool&>>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<volatile bool &&, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_reference_t<std::remove_volatile_t<volatile bool&&>>, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_volatile_t<std::remove_reference_t<volatile bool&&>>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<const volatile bool, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_cv_t<const volatile bool>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<const volatile bool &, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_reference_t<std::remove_cv_t<const volatile bool&>>, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_cv_t<std::remove_reference_t<const volatile bool&>>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<const volatile bool &&, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_reference_t<std::remove_cv_t<const volatile bool&&>>, bool>())); // false
    VALUE_LOGGER((std::is_same<std::remove_cv_t<std::remove_reference_t<const volatile bool&&>>, bool>())); // true
    HORIZONTAL_LINE();

    VALUE_LOGGER((std::is_same<std::remove_volatile_t<std::remove_reference_t<bool volatile&>>, bool>())); // true
}
